//观察者的目的就是给需要变化的那个元素增加一个观察者，当数据变化后执行新的方法

//用新值和老值进行对比 如果发生变化 就调用更新方法
// vm.$watch('a',function (val,oldval) {
//
// })

class Watcher {
    constructor(vm,expr,cb){
        this.vm=vm;
        this.expr=expr;
        this.cb=cb;
        //    先获取一下老值
        this.value=this.get();
    }
    getVal(vm,expr){
        expr=expr.split('.');//[message,a]
        //要收敛
        return expr.reduce((prev,next)=>{//vm.$data.a
            return prev[next];
        },vm.$data)
    }
    get(){
        //关联第一步
        Dep.target=this;
        let value=this.getVal(this.vm,this.expr);
        //关联第三步
        Dep.target=null;
        return value;
    }
//    对外暴露的方法
    update(){
        let newValue=this.getVal(this.vm,this.expr);
        let oldValue=this.value;
        if(newValue!=oldValue){
            this.cb(newValue);//对应watch的callback
        }
    }
}
